
#include <type_traits>
#include <iostream>

namespace NSCh122
{
  template <bool AddOrRemoveRef> struct Fun_;

  template <>
  struct Fun_<true> {
    template <typename T>
    using type = std::add_lvalue_reference<T>;
  };

  template <>
  struct Fun_<false> {
    template <typename T>
    using type = std::remove_reference<T>;
  };

//   template <typename T> // 语法不支持，不能有多个模板参数列表
//   template <bool AddOrRemove>
//   using Fun = typename Fun_<AddOrRemove>::template type<T>;

//   template <typename T>
//   using Res_ = Fun<false>;

  template <typename T, bool AddOrRemove>  // 合法
  using Fun = typename Fun_<AddOrRemove>::template type<T>;

  template <typename T>
  using Res_ = Fun<T, false>;

  Res_<int&>::type h = 3;
}

int main()
{
  using namespace NSCh122;
  
  // 测试1：添加引用（AddOrRemove = true）
  using Type1 = Fun<int, true>::type;  // int -> int&
  std::cout << "Fun<int, true>: " 
            << (std::is_same_v<Type1, int&> ? "int&" : "其他") 
            << std::endl;
  
  // 测试2：移除引用（AddOrRemove = false）
  using Type2 = Fun<int&, false>::type;  // int& -> int
  std::cout << "Fun<int&, false>: " 
            << (std::is_same_v<Type2, int> ? "int" : "其他") 
            << std::endl;
  
  // 测试3：使用 Res_ 别名（默认移除引用）
  using Type3 = Res_<int&>::type;  // int& -> int // Res_ 的定义，Fun模版参数二传的false
  std::cout << "Res_<int&>: " 
            << (std::is_same_v<Type3, int> ? "int" : "其他") 
            << std::endl;
  
  // 测试4：实际使用
  Res_<int&>::type h = 3;  // h 的类型是 int
  std::cout << "h = " << h << std::endl;
  
  // 测试5：检查类型
  std::cout << "\n类型检查：" << std::endl;
  std::cout << "int 是引用? " << std::is_reference_v<int> << std::endl;     //0
  std::cout << "int& 是引用? " << std::is_reference_v<int&> << std::endl;   //1
  std::cout << "Type1 是引用? " << std::is_reference_v<Type1> << std::endl; //1
  std::cout << "Type2 是引用? " << std::is_reference_v<Type2> << std::endl; //0
  std::cout << "Type3 是引用? " << std::is_reference_v<Type3> << std::endl; //0
  
  return 0;
}